package io.gitee.yxsnake.framework.system.api;

import com.github.lianjiatech.retrofit.spring.boot.core.RetrofitClient;
import io.gitee.yxsnake.framework.core.domain.Result;
import io.gitee.yxsnake.framework.core.domain.model.LoginUser;
import io.gitee.yxsnake.framework.core.domain.model.XcxLoginUser;
import io.gitee.yxsnake.framework.core.exception.ServiceException;
import io.gitee.yxsnake.framework.core.exception.user.UserException;
import io.gitee.yxsnake.framework.system.api.domain.bo.RemoteUserBo;
import io.gitee.yxsnake.framework.system.api.domain.vo.RemoteUserVo;
import retrofit2.http.Body;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Query;

import java.util.List;

/**
 * @author snake
 * @description 用户服务
 * @since 2024/11/2 23:07
 */
@RetrofitClient(baseUrl = "${retrofit.pisces-system-server:http://pisces-system-server:21001/}")
public interface RemoteUserService {

    /**
     * 通过用户名查询用户信息
     *
     * @param username 用户名
     * @param tenantId 租户id
     * @return 结果
     */
    @GET(value = "inner/user/getUserInfoWithUsername")
    Result<LoginUser> getUserInfoWithUsername(@Query("username") String username, @Query("tenantId") String tenantId) throws UserException;

    /**
     * 通过用户id查询用户信息
     *
     * @param userId   用户id
     * @param tenantId 租户id
     * @return 结果
     */
    @GET(value = "inner/user/getUserInfoWith")
    Result<LoginUser> getUserInfoWithUserId(@Query("userId") Long userId, @Query("tenantId") String tenantId) throws UserException;

    /**
     * 通过手机号查询用户信息
     *
     * @param phoneNumber 手机号
     * @param tenantId    租户id
     * @return 结果
     */
    @GET(value = "inner/user/getUserInfoByPhoneNumber")
    Result<LoginUser> getUserInfoByPhoneNumber(@Query("phoneNumber") String phoneNumber,@Query("tenantId") String tenantId) throws UserException;

    /**
     * 通过邮箱查询用户信息
     *
     * @param email    邮箱
     * @param tenantId 租户id
     * @return 结果
     */
    @GET(value = "inner/user/getUserInfoByEmail")
    Result<LoginUser> getUserInfoByEmail(@Query("email") String email, @Query("tenantId") String tenantId) throws UserException;

    /**
     * 通过openid查询用户信息
     *
     * @param openId openid
     * @return 结果
     */
    @GET(value = "inner/user/getUserInfoByOpenid")
    Result<XcxLoginUser> getUserInfoByOpenid(@Query("openId") String openId) throws UserException;

    /**
     * 注册用户信息
     *
     * @param remoteUserBo 用户信息
     * @return 结果
     */
    @POST(value = "inner/user/registerUserInfo")
    Result<Boolean> registerUserInfo(@Body RemoteUserBo remoteUserBo) throws UserException, ServiceException;

    /**
     * 通过userId查询用户账户
     *
     * @param userId 用户id
     * @return 结果
     */
    @GET(value = "inner/user/selectUserNameById")
    Result<String> selectUserNameById(@Query("userId") Long userId);

    /**
     * 通过用户ID查询用户昵称
     *
     * @param userId 用户id
     * @return 结果
     */
    @GET(value = "inner/user/selectNicknameById")
    Result<String> selectNicknameById(@Query("userId") Long userId);

    /**
     * 通过用户ID查询用户账户
     *
     * @param userIds 用户ID 多个用逗号隔开
     * @return 用户名称
     */
    @GET(value = "inner/user/selectNicknameByIds")
    Result<String> selectNicknameByIds(@Query("userIds") String userIds);

    /**
     * 通过用户ID查询用户手机号
     *
     * @param userId 用户id
     * @return 用户手机号
     */
    @GET(value = "inner/user/selectPhoneNumberById")
    Result<String> selectPhoneNumberById(@Query("userId") Long userId);

    /**
     * 通过用户ID查询用户邮箱
     *
     * @param userId 用户id
     * @return 用户邮箱
     */
    @GET(value = "inner/user/selectEmailById")
    Result<String> selectEmailById(@Query("userId") Long userId);

    /**
     * 更新用户信息
     *
     * @param userId 用户ID
     * @param ip     IP地址
     */
    @GET(value = "inner/user/recordLoginInfo")
    Result<Boolean> recordLoginInfo(@Query("userId") Long userId, @Query("ip")String ip);

    /**
     * 通过用户ID查询用户列表
     *
     * @param userIds 用户ids
     * @return 用户列表
     */
    @POST(value = "inner/user/selectListByIds")
    Result<List<RemoteUserVo>> selectListByIds(@Body List<Long> userIds);

    /**
     * 通过角色ID查询用户ID
     *
     * @param roleIds 角色ids
     * @return 用户ids
     */
    @POST(value = "inner/user/selectUserIdsByRoleIds")
    Result<List<Long>> selectUserIdsByRoleIds(@Body List<Long> roleIds);
}

